package cn.tedu.charging.order.websocket;

import cn.tedu.charging.common.protocol.WebSocketMessage;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Component
@ServerEndpoint("/ws/server/{userId}")
public class WebSocketServer {
    // 创建一个静态变量(如果是动态就无法获取session)
    private final static Map<Integer,Session> sessionMap = new ConcurrentHashMap<>();
    // WebSocketServer 对象 如果可以实现ws通讯逻辑需要我们了解其所有的通信
    // 调用的终端方法
    @OnOpen
    public void onOpen(Session session, @PathParam ("userId") Integer sid) {
        log.info("开始建立连接,id:{},入参：{}", session.getId(), sid);
        // 给用户推送一个消息
        try {
            session.getBasicRemote().sendText("欢迎使用WebSocket");
        } catch (Exception e) {
            log.error("推送消息失败,{}", e.getMessage());
        }
        // 存储注册映射数据
        sessionMap.put(sid,session);
    }
    @OnClose
    public void onClose(Session session, @PathParam ("userId") Integer sid) {
        log.info("连接断开,id:{}", session.getId());
        sessionMap.remove(sid);
    }
    @OnError
    public void onError(Throwable error, Session session) {
        log.info("连接异常,{},id:{}", error.getMessage(),session.getId());
    }
    // 当客户端发送消息时,调用此方法
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("{}接收到消息:{}", session.getId(), message);
    }
    public void sendMessage(Integer userId, String message) {
        // 1. 使用sid获取session对象
        Session session = sessionMap.get(userId);
        if (session != null) {
            try {
                session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            log.error("用户不在线");
        }
    }

    public <T> void sendMessage(Integer userId, WebSocketMessage<T> message) {
        // 序列化过程
        String jsonStr = JSON.toJSONString(message);
        sendMessage(userId, jsonStr);
    }
}
